package com.ly.mpayment.rest;


import javax.servlet.http.HttpServletRequest;

import com.auth0.jwt.JWT;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.ly.mpayment.core.secuity.MD5;
import com.ly.mpayment.core.util.Config;
import com.ly.mpayment.core.util.DateUtils;
import com.ly.mpayment.core.util.JsonUtils;
import com.ly.mpayment.core.util.ResultMessage;
import com.ly.mpayment.core.util.StringUtils;
import com.ly.mpayment.core.util.TokenUtils;
import com.ly.mpayment.core.util.UserUtil;
import com.ly.mpayment.persist.entity.DownShopInfo;
import com.ly.mpayment.persist.entity.User;
import com.ly.mpayment.persist.service.downshopinfo.IDownShopInfoService;
import com.ly.mpayment.persist.service.user.IUserService;
import com.ly.mpayment.rest.recharge.IpUtil;

import net.sf.json.JSONObject;

/**
 * 抽象rest 建立统一的验证方法
 *
 *
 */
public abstract class AbsRest {


	/**
	 * 获取当前用户
	 * @param request
	 * @param userService
	 * @return
	 */
	public User getUser(HttpServletRequest request, IUserService userService){
		String token = request.getHeader("token");
		if (token != null) {
			DecodedJWT jwt;
			try {
				jwt = JWT.decode(token);
				if (jwt != null) {
					JSONObject jsonJwt = JsonUtils.converToJson(jwt.getSubject());
					if (jsonJwt != null) {
						User login = userService.findByUserid(jsonJwt.getString(Config.tokenSignAttr));
						if(login != null ){
							return login;
						}
					}
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return null;
	}

	/**
	 * 管理员专用验证  只有管理员才能使用的接口 检查管理员请求的合法性
	 * 判断传入参数中json是否合法 如返回为 null 则参数合法 检查用户是否在其他地方登录
	 *
	 * @param args
	 * @return
	 */
	public String validationParameter(String data, HttpServletRequest request, IUserService userService,
			String... args) {
		if (!StringUtils.isBlank(data)) {
			String token = request.getHeader("token");
			if (token != null) {
				DecodedJWT jwt;
				try {
					jwt = JWT.decode(token);
					if (jwt != null) {
						JSONObject json = JsonUtils.converToJson(jwt.getSubject());
						if (json != null) {
							User login = userService.findByUserid(json.getString(Config.tokenSignAttr));
							if(login != null && UserUtil.checkRoleAll(login)){
//								LogUtil.saveInfo("token="+TokenUtils.createToken(login.getUseruuid(), DateUtils.toLongDate(login.getLastlogintime())));
//								LogUtil.saveInfo("token="+token);
								if (login != null) {
									if( TokenUtils.createToken(login.getUseruuid(), login.getLastlogintime().getTime()+"").equals(token)){
										if (DateUtils.getNowDate().getTime() < login.getExpire().getTime() ) {
											try {
												JSONObject obj = JsonUtils.converToJson(data);
												for (String item : args) {
													if (!StringUtils.isBlank(item) && !obj.containsKey(item)) {
														return ResultMessage.getFailt(ResultMessage.parameterError);
													}
												}

												login.setExpire(DateUtils.addMinutes(Config.TOKEN_TIME, DateUtils.getNowDate()));
												userService.updateUser(login);
												return null;
											} catch (Exception e) {
												e.printStackTrace();
											}
										} else {
											return ResultMessage.getFailt(ResultMessage.tokenError);
										}
									}else{
										return ResultMessage.getFailt(ResultMessage.LOGINNOTUSER);
									}
								}
								return ResultMessage.getFailt(ResultMessage.LOGINNOTUSER);
							}
							return ResultMessage.getFailt(ResultMessage.systemRoleError);
						}
					}
				} catch (JWTDecodeException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			return ResultMessage.getFailt(ResultMessage.tokenError);
		} else {
			return ResultMessage.getFailt(ResultMessage.parameterError);
		}
	}

	public String validationParameterToken( HttpServletRequest request, IUserService userService) {
			String token = request.getHeader("token");
			if (token != null) {
				DecodedJWT jwt;
				try {
					jwt = JWT.decode(token);
					if (jwt != null) {
						JSONObject json = JsonUtils.converToJson(jwt.getSubject());
						if (json != null) {
							User login = userService.findByUserid(json.getString(Config.tokenSignAttr));
							if(login != null && UserUtil.checkRoleAll(login)){
//								LogUtil.saveInfo("token="+TokenUtils.createToken(login.getUseruuid(), DateUtils.toLongDate(login.getLastlogintime())));
//								LogUtil.saveInfo("token="+token);
								if (login != null) {
									if( TokenUtils.createToken(login.getUseruuid(), login.getLastlogintime().getTime()+"").equals(token)){
										if (DateUtils.getNowDate().getTime() < login.getExpire().getTime() ) {
											try {
												login.setExpire(DateUtils.addMinutes(Config.TOKEN_TIME, DateUtils.getNowDate()));
												userService.updateUser(login);
												return null;
											} catch (Exception e) {
												e.printStackTrace();
											}
										} else {
											return ResultMessage.getFailt(ResultMessage.tokenError);
										}
									}else{
										return ResultMessage.getFailt(ResultMessage.LOGINNOTUSER);
									}
								}
								return ResultMessage.getFailt(ResultMessage.LOGINNOTUSER);
							}
							return ResultMessage.getFailt(ResultMessage.systemRoleError);
						}
					}
				} catch (JWTDecodeException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			return ResultMessage.getFailt(ResultMessage.tokenError);
	}

	/**
	 * 检查下游渠道商请求的合法性
	 * 验证 用户的key 并且 验证ip是否正确
	 * @param request
	 * @return
	 */
	public String validationParameterAndIp(String data,HttpServletRequest request, IDownShopInfoService shopService) {
		if(!StringUtils.isBlank(data)){
			JSONObject json = JsonUtils.converToJson(data);
			if (json != null) {
				DownShopInfo shop = shopService.findShopInfoByUuid(json.getString("shopUuid"));
				StringBuffer sb = null;
				sb = new StringBuffer();
				sb.append(json.getString(""));
				if (shop != null &&  shop.getDownshopip().equals(IpUtil.getIp(request)) && json.getString("sign").equals(MD5.md5(sb.toString()))) {
						return null;
				}
				return ResultMessage.getFailt(ResultMessage.shopNotexistError);
			}
		}
		return ResultMessage.getFailt(ResultMessage.parameterError);
	}

	/**
	 * 管理员
	 * @param request
	 * @param userService
	 * @return
	 */
	public String validationParameterGetRole(HttpServletRequest request, IUserService userService) {
			String token = request.getHeader("token");
			if (token != null) {
				DecodedJWT jwt;
				try {
					jwt = JWT.decode(token);
					if (jwt != null) {
						JSONObject json = JsonUtils.converToJson(jwt.getSubject());
						if (json != null) {
							User login = userService.findByUserid(json.getString(Config.tokenSignAttr));
							if(login != null && UserUtil.checkRole(login)){
								if (login != null && TokenUtils.createToken(login.getUseruuid(),  login.getLastlogintime().getTime()+"").equals(token)) {
									if ( DateUtils.getNowDate().getTime() < login.getExpire().getTime()) {
										login.setExpire(DateUtils.addMinutes(Config.TOKEN_TIME, DateUtils.getNowDate()));
										userService.updateUser(login);
										 return null;
									} else {
										return ResultMessage.getFailt(ResultMessage.tokenSessionError);
									}
								}
								return ResultMessage.getFailt(ResultMessage.LOGINNOTUSER);
							}
							return ResultMessage.getFailt(ResultMessage.systemRoleError);
						}
					}
				} catch (JWTDecodeException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			return ResultMessage.getFailt(ResultMessage.tokenError);
	}

	/**
	 * 判断传入参数中json是否合法 如返回为 null 则参数合法
	 *
	 * @param args
	 * @return
	 */
	public String validationParameter(String jsonIn, String... args) {
		if (!StringUtils.isBlank(jsonIn)) {
			try {
				JSONObject obj = JsonUtils.converToJson(jsonIn);
				for (String item : args) {
					if (!StringUtils.isBlank(item) && !obj.containsKey(item)) {
						return ResultMessage.getFailt(ResultMessage.parameterError);
					}
				}
				return null;
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return ResultMessage.getFailt(ResultMessage.parameterError);
	}

	// /**
	// * 判断传入参数中json是否合法 如返回为 null 则参数合法
	// * 验证token的合法性
	// * @param inputString
	// * @param args
	// * @return
	// */
	// @SuppressWarnings("static-access")
	// public String validationParameterToken(String jsonIn,String token,
	// String... args) {
	// if(TokenUtils.verifyToken(token)){
	//
	// }
	// if (!StringUtils.isBlank(jsonIn)) {
	// try {
	// JSONObject obj = new JSONObject().fromObject(jsonIn);
	// for (String item : args) {
	// if (!StringUtils.isBlank(item) && !obj.containsKey(item)) {
	// return ResultMessage.getFailt(ResultMessage.parameterError, "参数错误,缺失参数:"
	// + item);
	// }
	// }
	// return null;
	// } catch (Exception e) {
	// e.printStackTrace();
	// }
	// }
	// return ResultMessage.getFailt(ResultMessage.parameterError);
	// }
}
